package com.atguigu.command;

/**
 * @program: design-patterns
 * @author: yangshen
 * @description: 远程控制类（一共5个产品10个按钮，开按钮有5个，关按钮有5个）
 * 命令模式的优点：
 *      当产品发生改变时（从电灯->电视机）本远程控制类不需做出改动，因为是通过接口来聚合的中间层，只需在具体调用时指明具体的产品即可
 * @create: 2022-03-01 14:34
 **/
public class RemoteController {
    /**
     * 开 按钮的命令数组
     */
    Command[] onCommands;
    /**
     * 管 按钮的命令数组
     */
    Command[] offCommands;
    /**
     * 执行撤销的命令
     */
    Command undoCommands;

    public RemoteController() {
        this.onCommands = new Command[5];
        this.offCommands = new Command[5];
        for (int i = 0; i < 5; i++) {
            onCommands[i] = new NoCommand();
            offCommands[i] = new NoCommand();
        }
    }

    //给我们的按钮设置需要的命令;(可以是 电灯/电视机，的打开/关闭按钮)
    public void setCommand(int num, Command onCommand, Command offCommand){
        onCommands[num] = onCommand;
        offCommands[num] = offCommand;
    }

    /**
     * 按下开按钮
     * @param no 开命令的编号
     */
    public void onButtonWasPushed(int no){
        //找到你按下的开的按钮，并调用对应的方法
        onCommands[no].execute();
        //记录这次的操作，用于撤销
        undoCommands = onCommands[no];
    }

    /**
     * 按下关按钮
     * @param no 关命令的编号
     */
    public void offButtonWasPushed(int no){
        //找到你按下关的按钮，并调用对应的方法
        offCommands[no].execute();
        //记录这次的操作，用于撤销
        undoCommands = offCommands[no];
    }

    /**
     * 按下撤销按钮
     * @param no 撤销命令的编号
     */
    public void undoButtonWasPushed(int no){
        undoCommands.undo();
    }



}
